package com.itbaizhan;
/**数据库连接池：允许应用程序重复使用一个现有的数据库连接*/
/*什么是数据库连接池
数据库连接池（Connection pooling）是程序启动时建立足够的数据库
连接，并将这些连接组成一个连接池，由程序动态地对池中的连接进行申请，
使用，释放。
它允许应用程序重复使用一个现有的数据库连接，而不是再重新建立一个；
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连
接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。*/

/*不使用数据库连接池存在的问题
普通的JDBC数据库连接使用 DriverManager 来获取，每次向数据库建
立连接的时候都要将 Connection加载到内存中，再验证用户名和密码，
所以整个过程比较耗时。
需要数据库连接的时候，就向数据库要求一个，执行完成后再断开连接。
这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的
重复利用。若同时有几百人甚至几千人在线，频繁的进行数据库连接操作将
占用很多的系统资源，严重的甚至会造成服务器的崩溃。
对于每一次数据库连接，使用完后都得断开。否则，如果程序出现异常而未能
关闭，将会导致数据库系统中的内存泄漏，最终将导致重启数据库。*/

/*JDBC数据库连接池的必要性
数据库连接池的基本思想：为数据库连接建立一个“缓冲池”。预先在缓冲池中放
入一定数量的连接，当需要建立数据库连接时，只需从“缓冲池”中取出一个，
使用完毕之后再放回去。
数据库连接池负责分配、管理和释放数据库连接，它允许应用程序重复使用一
个现有的数据库连接，而不是重新建立一个。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中，这些数
据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被
使用，连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库
连接数量限定了这个连接池能占有的最大连接数，当应用程序向连接池请求的
连接数超过最大连接数量时，这些请求将被加入到等待队列中。*/

/*数据库连接池的优点
资源重用： 由于数据库连接得以重用，避免了频繁创建，释放连接引起的大量
性能开销。在减少系统消耗的基础上，另一方面也增加了系统运行环境的平稳性。
更快的系统反应速度： 数据库连接池在初始化过程中，往往已经创建了若干
数据库连接置于连接池中备用。此时连接的初始化工作均已完成。
对于业务请求处理而言，直接利用现有可用连接避免了数据库连接初始化和释
放过程的时间开销，从而减少了系统的响应时间。
新的资源分配手段：  对于多应用共享同一数据库的系统而言，可在应用层
通过数据库连接池的配置实现某一应用最大可用数据库连接数的限制避免某一
应用独占所有的数据库资源.
统一的连接管理：   避免数据库连接泄露在较为完善的数据库连接池实现中，
可根据预先的占用超时设定，强制回收被占用连接，从而避免了常规数据库连接
操作中可能出现的资源泄露。*/
public class DruidTest00 {
    /*常用的数据库连接池

c3p0：是一个开源组织提供的数据库连接池，速度相对较慢，稳定性还可以。
DBCP：是Apache提供的数据库连接池。速度相对c3p0较快，但自身存在bug。
Druid：是阿里提供的数据库连接池，据说是集DBCP、c3p0优点于一身的数据库连接池，目前经常使用。*/

/*druid 配置信息：
* name                 配置这个属性的意义在于，如果存在多个数据
*                       源，监控的时候可以通过名字来区分开来。
*                        如果没有配置，将会生成一个名字，
*                   格式是："DataSource-" +
*                           System.identityHashCode(this)
*
* url                   连接数据库的url。
*
*username                连接数据库的用户名。
*
* password              连接数据库的密码。
*
*driverClassName      根据url自动识别       这一项可配可不配，
*                                     如果不配置druid会根据
*                                       url自动识别dbType，
*                                     然后选择相应的
*                                     driverClassName(建议配置下)
*
* initialSize      0         初始化时建立物理连接的个数。
*
* maxActive         10      最大连接池数量
* minIdle                   最小连接池数量
*
* maxWait               获取连接时最大等待时间，单位毫秒。配置
*                       了maxWait之后，缺省启用公平锁，并发
*                       效率会有所下降，如果需要可以通过配置
*                       useUnfairLock属性为true使用非公平锁。
*
* poolPreparedStatements      false    是否缓存preparedStatement，
*                                     也就是PSCache。
*                                   PSCache对支持游标的数据
*                                   库性能提升巨大，比如说
*                                   oracle。在mysql下建议关闭。
*
* maxOpenPreparedStatements	   -1   要启用PSCache，必须配置大于0，当大于0时，
*                                   poolPreparedStatements
*                                   自动触发修改为true。在
*                                   Druid中，不会存在
*                               Oracle下PSCache占用内存
*                           过多的问题，可以把这个数值配置大一些，
*                                       比如说100
*
*validationQuery            用来检测连接是否有效的sql，要求是
*                           一个查询语句。如果validationQuery为null，
*                           testOnBorrow、testOnReturn、
*                           testWhileIdle都不会其作用。
*
* testOnBorrow      TRUE    申请连接时执行validationQuery
*                           检测连接是否有效，做了这个配置会降低性能。
*
* testOnReturn      false   归还连接时执行validationQuery
*                           检测连接是否有效，做了这个配置会降低性能
*
* testWhileIdle     false  建议配置为true，不影响性能，并且
*                           保证安全性。申请连接的时候检测，
*                           如果空闲时间大于
*                       timeBetweenEvictionRunsMillis，
*                       执行validationQuery检测连接是否有效。
*
*imeBetweenEvictionRunsMillis       有两个含义：
*                               1) Destroy线程会检测连接的间隔时间
*                               2) testWhileIdle的判断依据，
*                               详细看testWhileIdle属性的说明
*
* numTestsPerEvictionRun        不再使用，一个
*                               DruidDataSource只支持一个
*                                   EvictionRun
*
* minEvictableIdleTimeMillis
*
* connectionInitSqls        物理连接初始化的时候执行的sql
*
* exceptionSorter     根据dbType自动识别     当数据库抛出一
*                                       些不可恢复的异常时，
*                                           抛弃连接
*
* filters             属性类型是字符串，通过别名的方式配置扩展
*                      插件，常用的插件有： 监控统计用的filter:stat
*                   日志用的filter:log4j防御sql注入的filter:wall
*
* proxyFilters      类型是List<com.alibaba.druid.filter
*                   .Filter>，如果同时配置了filters和proxyFilters，
*                   是组合关系，并非替换关系*/

    /*加载配置文件

获取连接池对象

通过连接池对象获取连接*/
}
